package com.zhangxin.aiInterview.manager.xfapi.http;

import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 提取字符串中的面试题，返回一个json数组
 */
@Component
public class ExtractInterviewQuestionApi {
    // 静态变量缓存 Prompt（仅初始化一次）
    private static final String SYSTEM_PROMPT;

    static {
        // 初始化 System Prompt
        SYSTEM_PROMPT = "SYSTEM_PROMPT = \"你是一个面试记录清洗专家。\\n\" +\n" +
                "    \"我会提供一段包含面试对话、八股文、技术笔记或经验总结的原始文本，请你从中**提取所有可以作为“面试题”的内容**。\\n\" +\n" +
                "    \"⚠ 你的任务是：\\n\" +\n" +
                "    \"- 从文本中提取出**所有可能作为面试题的语句**。\\n\" +\n" +
                "    \"- 只保留**问题本身**（例如：const int* 和 int* const 有什么区别？）\\n\" +\n" +
                "    \"- 所有结果必须是**字符串组成的 JSON 数组**。\\n\" +\n" +
                "    \"- ❗不能输出解释、段落或非 JSON 内容。\\n\" +\n" +
                "    \"- ❗不要进行讲解、归纳、拓展、注释，直接输出结果。\\n\" +\n" +
                "    \" 示例：\\n\" +\n" +
                "    \"输入：“数组和链表的区别”\\n\" +\n" +
                "    \"输出：[\\\"数组和链表有什么区别？\\\"]\\n\" +\n" +
                "    \"现在请你根据我给的文本，提取面试题，并返回严格的 JSON 数组。\";\n";
    }

    @Value("${xunfei.apiPassword}")
    private String apiPassword;

    /**
     * 提取面试题
     *
     * @param questionStr 面试题字符串
     * @return
     */
    public  String extractInterviewQuestion(String questionStr) {
        // 1. 请求地址和Headers
        String url = "https://spark-api-open.xf-yun.com/v1/chat/completions";

        // 2. 构造请求体（JSON）
        JSONObject requestBody = new JSONObject();
        requestBody.set("model", "generalv3.5");

        //构造用户prompt
        JSONArray messages = new JSONArray();
        messages.add(new JSONObject().set("role", "system").set("content", SYSTEM_PROMPT));
        messages.add(new JSONObject().set("role", "user").set("content", questionStr));

        requestBody.set("messages", messages);
        requestBody.set("top_p", 0.8);

        // 3. 发送请求
        String jsonStr = HttpRequest.post(url)
                .header("Content-Type", "application/json")
                .header("Authorization", "Bearer " + apiPassword)
                .body(requestBody.toString())
                .execute()
                .body();
        JSONObject rootObj = JSONUtil.parseObj(jsonStr);
        return (String)rootObj.getByPath("choices[0].message.content");
    }
}
